package com.heima.wemedia;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;


@SpringBootApplication
@EnableDiscoveryClient
//heima-leadnews-feign-api模块不是引入了吗，为什么还要加上
@EnableFeignClients(basePackages = "com.heima.apis")//开启feign远程接口调用，需要指定扫描包，
// 因为它默认扫描com.heima.wemedia包下的接口，需要扫描的是com.heima.apis.article下的IArticleClient
// 才能在WmNewsAutoScanServiceImpl里注入@Autowired
                                    //private IArticleClient articleClient;
@MapperScan("com.heima.wemedia.mapper")
@EnableAsync //开启异步调用
@EnableScheduling //开启调度任务
// 然后在具体业务WmNewsAutoScanServiceImpl里的autoScanWmNews上加上@Async，表明他是一个异步调用方法
//@RibbonClients // 可选，如果你有 Ribbon 客户端需要使用
@EnableCircuitBreaker//启用断路器，默认是关闭的，但是在配置文件中可以配置开启
// (如果检测到10秒内请求的失败率超过50%，就会触发熔断机制，之后每隔5秒重新尝试请求微服务，
// 如果微服务不能响应，继续保持熔断状态，如果微服务可达，则关闭熔断机制，恢复正常请求)
public class WemediaApplication {

    public static void main(String[] args) {
        SpringApplication.run(WemediaApplication.class,args);
    }

    @Bean//mybatis-plus的分页插件//乐观锁也是添加到启动器的拦截器中
    // 才能在使用IPage page = new Page(dto.getPage(), dto.getSize());（在Impl里）
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
//        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
//        乐观锁（这里用不到，ScheduleApplication里用到）
        return interceptor;
    }
}

//
//                     |-------------------|
//                     |   heima-leadnews  |
//                     |-------------------|
//                               ^
//                               |继承
//                               |
//               |------------------------------|
//               |   heima-leadnews-feign-apis  | 定义feign接口
//               |------------------------------|
//                 ^                      ^
//                 |依赖                   |实现
//  |------------------------------|   |----------------------------|
//  |   heima-leadnews-wemedia     |   |  heima-leadnews-article    |
//  |------------------------------|   |----------------------------|
